﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;


namespace Systemet.Domain
{
    class PrognosController
    {
        private Technical.PrognosConnection pC = new Technical.PrognosConnection();
        private Domain.ProdukController pController;
        private Domain.ProdukController productController;
        private Views.Prognoskort pk;
        private List<Prognos> konton;

        //Hämtar antalet gjorda prognoser (månader)
        public int GetValidatedPrognoses(int year)
        {
            return pC.RetrieveBudgetedPrognosMonths(year);
        }

        //Lägger in alla produkter från Produktregister till Prognoser, Anropet till denna ligger i prognoskort load.
        //Endast för första gången just nu
        public void CreatemonthlyPrognoses(int month)
        {
            pk = (Views.Prognoskort)AccessController.Instance.MainView;
            List<Prognos> newPrognoses = new List<Prognos>();
            pC = new Technical.PrognosConnection();
            pController = new ProdukController();
            List<Intäktsbudget> budgets = pC.GetBudgetsOnThisYear();
            IEnumerable<Produktregister> products = pController.Produktlista;
            DateTime actualMonthlyPrognos = new DateTime(DateTime.Now.Year, month, 1);

            foreach (Produktregister p in products)
            {
                int budget = 0;
                Prognos pr = new Prognos();
                pr.ProduktID = p.produktID;
                pr.Datum = actualMonthlyPrognos;
                pr.AvserDatum = DateTime.Now;
                pr.Föregåendeprognos = budget;
                pr.Låst = false;
                pr.prognos = null;
                pr.Upparbetat = budget;
                pr.Utfallmånad = budget;
                pr.Signatur = AccessController.Instance.LoggedInUser.UserName;
                foreach (Intäktsbudget iB in budgets)
                {
                    if (p.produktID.TrimEnd() == iB.ProdID.TrimEnd())
                    {
                        if (iB.Budget.HasValue)
                        {
                            budget += (int)iB.Budget;
                        }
                    }
                }
                pr.Budget = budget * 1000;
                newPrognoses.Add(pr);
            }

            if (pC.ValidatePrognosedMonth(month))
            {
                pC.InsertProducts(newPrognoses);
            }


        }
        /// <summary>
        /// Läser in textfilen, kollar och kollar om de nya intäkterna på produkter 
        /// faktiskt tillhör produkter i systemet, annars skapas nya produkter
        /// </summary>
        /// <param name="PrognosLista"></param>
        /// <param name="month"></param>
        public void ReadAllFiles(List<Prognos> PrognosLista, int month)
        {
            productController = new ProdukController();
            IEnumerable<Produktregister> products = productController.Produktlista;
            int value = 0;

            foreach (Prognos progn in PrognosLista)
            {
                if (progn.Datum.Month == month)
                {
                    value = 1;
                    foreach (Produktregister p in products)
                    {
                        if (p.produktID.TrimEnd() == progn.ProduktID.TrimEnd())
                        {
                            value = 0;
                            break;
                        }

                    }
                    if (value > 0)
                    {
                        productController.CreateProductFromfile(progn.ProduktID, progn.Produkt);
                    }

                }
            }


            CreatemonthlyPrognoses(month);
            pC = new Technical.PrognosConnection();
            foreach (Prognos p in PrognosLista)
            {
                pC.InsertText(p); //Metoden som skriver till Linq
            }

        }
        //Metoden för att hämta alla Prognoser
        public List<Prognos> GetPrognos(int month, string avd, string prodkategori, string prodgrupp, string prodNamn)
        {
            pC = new Technical.PrognosConnection();
            return pC.ShowAllPrognos(month, avd, prodkategori, prodgrupp, prodNamn);

        }
        //Metod för att hämta alla tidigare gjorda prognoser
        public List<Prognos> RetrieveEarlierPrognoses(int month)
        {
            pC = new Technical.PrognosConnection();
            return pC.RetrieveAllEarlierPrognoses(month);

        }
        //lägga in Upparbetat från Drift/Utvecklingschef
        public void InsertUpparbetatValue(string prodID, int month, int upparbetat)
        {
            pC.InsertUpparbetat(prodID, month, upparbetat);
        }
        //Lägga in Prognos från Marknadschef
        public void InsertPrognosValue(string prodID, int month, int prognos)
        {
            pC.InsertPrognosValue(prodID, month, prognos);
        }

        //Metod för att validering av att tidigare månad låsts
        public bool ValidatePrognosesLocked(int month)
        {
            pC = new Technical.PrognosConnection();
            return pC.ValidatePrognosesLockedDown(month);
        }
        //Validerar att alla produkter fått en prognos allokerad på sig
        public List<Prognos> ValidateIfPrognosesIsOn(int month)
        {
            pC = new Technical.PrognosConnection();
            return pC.CheckForUnPrognosedProducts(month);
        }

        //Låser alla prognosteserade produkter på månad
        public bool LockPrognoses(int month)
        {
            pC = new Technical.PrognosConnection();
            return pC.LockPrognoses(month);
        }

        ////Metoden för att hämta alla Intäktsbudgetar
        //public List<Intäktsbudgetregister> GetAllBudgets(DateTime year)
        //{
        //    pC = new Technical.PrognosConnection();
        //    pk = (Views.Prognoskort)AccessController.Instance.MainView;
        //    return pC.GetBudgetsOnThisYear();
        //}

        ////Hämtar alla produkter
        //public List<Produkt> GetAllProducts()
        //{
        //    pC = new Technical.PrognosConnection();
        //    pk = (Views.Prognoskort)AccessController.Instance.MainView;
        //    return pC.ShowAllProducts();
        //}

        public List<string> GetAllBudgetedYears()
        {
            return pC.RetrieveBudgetedYears();
        }

        //FIltreringskriterier från Sökkriterier i sidPrognos
        public void RetrieveFilterOptions(string avd, string prodkategori, string prodgrupp, string prodNamn)
        {
            pk = (Views.Prognoskort)AccessController.Instance.MainView;
            pk.filterPrognoses(avd, prodkategori, prodgrupp, prodNamn);
        }
    }
}
